package main

import (
	"fmt"
	"os"
)

// 3. 自定义错误类型
type PathError struct {
	Op   string
	Path string
	Err  error
}

func (e *PathError) Error() string {
	return fmt.Sprintf("%s %s: %v", e.Op, e.Path, e.Err)
}

func openFile(path string) error {
	_, err := os.Open(path)
	if err != nil {
		return &PathError{Op: "open", Path: path, Err: err} // 返回自定义错误类型
	}
	return nil
}

func main() {
	err := openFile("nonexistent.txt")
	if err != nil {
		if pathErr, ok := err.(*PathError); ok { // 类型断言检查具体错误类型
			fmt.Printf("自定义错误详情: 操作=%s, 路径=%s, 原因=%v\n",
				pathErr.Op, pathErr.Path, pathErr.Err)
		} else {
			fmt.Println("其他错误:", err)
		}
	}
}
